package com.sunday.common.netty.e2_Time;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInboundHandlerAdapter;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;

/**
 *
 */
@Slf4j
public class TimeClientHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        /**
         * 在 TCP/IP 中，Netty 将从对等节点发送到 ByteBuf 中读取数据。
         */
        ByteBuf m = (ByteBuf) msg; // (1)
        try {
            long currentTimeMillis = (m.readUnsignedInt() - 2208988800L) * 1000L;
            log.info("{}", new Date(currentTimeMillis));
            ctx.close();
        } finally {
            m.release();
        }
    }

//    private ByteBuf buf;
//
//    /**
//     * handlerAdded 会在连接建立并准备通信时被调用。
//     * <p>
//     * 为了实现协议，您需要从服务器接收一个32位整数，因此您需要构造一个ByteBuf，它具有4个字节的容量。
//     * ByteBufAllocator 通过 ChannelHandlerContext.alloc() 获取当前的ByteBufAllocator。
//     */
//    @Override
//    public void handlerAdded(ChannelHandlerContext ctx) {
//        log.info("handlerAdded 会在连接建立并准备通信时被调用。");
//        buf = ctx.alloc().buffer(4); // (1)
//    }
//
//    /**
//     * handlerRemoved() 会在连接关闭并且 Channel 被 GC 时调用。
//     */
//    @Override
//    public void handlerRemoved(ChannelHandlerContext ctx) {
//        log.info("handlerRemoved 会在连接关闭并且 Channel 被 GC 时调用。");
//        /**
//         * ChannelHandler 有两个生命周期侦听器方法：和 。您可以执行任意（取消）初始化任务，
//         * 只要它长时间不阻塞即可。handlerAdded() handlerRemoved()
//         */
//        buf.release(); // (1)
//        buf = null;
//    }
//
//    /**
//     * channelRead() 会在接收到数据时被调用。
//     */
//    @Override
//    public void channelRead(ChannelHandlerContext ctx, Object msg) {
//        log.info("channelRead 会在接收到数据时被调用。");
//        ByteBuf m = (ByteBuf) msg;
//        /**
//         * 首先，所有接收的数据都应该被累积在 buf 变量中。
//         */
//        buf.writeBytes(m); // (2)
//        m.release();
//
//        /**
//         * 然后，处理器必须检查 buf 变量是否有足够的数据（4个字节），然后再继续处理它的内容。
//         */
//        if (buf.readableBytes() >= 4) { // (3)
//            long currentTimeMillis = (buf.readUnsignedInt() - 2208988800L) * 1000L;
//            log.info("{}", new Date(currentTimeMillis));
//            ctx.close();
//        }
//    }

    @Override
    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) {
        cause.printStackTrace();
        ctx.close();
    }
}
